package com.zhanglijie.improve.aqs.mix.readwrite.sysdemo;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * @author zhanglijie
 * @version 1.0
 * @since 1.1.0 2022/10/23 0023 19:49
 */
public class ReadWriteTestDemo2 {
    //演示一个线程拿到写锁之后 可以继续拿读锁 然后释放写锁再释放读锁(也可以先释放读锁再释放写锁） 降级了
    //不可以先拿读锁再拿写锁 （读写互斥，而上面先拿写再拿读是因为已经获得最好权限了 再拿读读不互斥的读锁是可以的） 不可以升级
    static ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();
    static Lock readLock = reentrantReadWriteLock.readLock();
    static Lock writeLock = reentrantReadWriteLock.writeLock();

    public static void main(String[] args) {
    try {
        writeLock.lock();
        System.out.println("获得写锁");
        readLock.lock();
        System.out.println("继续获得了读锁");
    }finally {
           writeLock.unlock();
           System.out.println("释放了写锁");
           readLock.unlock();
           System.out.println("释放读锁");
       }


    //  try { //不能先获得读锁再拿写锁 读锁不能升级为写锁（读写互斥，因为有可能别的线程也持有读锁）
    //     readLock.lock();
    //     System.out.println("继续获得了读锁");
    //     writeLock.lock();
    //     System.out.println("获得写锁");
    //
    // }finally {
    //     writeLock.unlock();
    //     System.out.println("释放了写锁");
    //     readLock.unlock();
    //     System.out.println("释放读锁");
    //}
    }

}
